package model

import "fmt"

// 声明一个user结构体，用来保存查询数据
type user struct {
	id   int
	name string
	age  int
}

// 插入单条数据
func Insert() {
	sqlStr := "insert into user(name, age) values (?,?)"
	ret, err := DB.Exec(sqlStr, "王五", 38)
	if err != nil {
		fmt.Printf("insert failed, err:%v\n", err)
		return
	}
	theID, err := ret.LastInsertId() // 新插入数据的id
	if err != nil {
		fmt.Printf("get lastinsert ID failed, err:%v\n", err)
		return
	}
	fmt.Printf("insert success, the id is %d.\n", theID)
}

// 插入多条数据
func InsertAll() {
	sqlStr := "insert into user(name, age) values (?,?)"
	insertInfo := map[string]int{
		"张三":  20,
		"李四":  30,
		"李世民": 9000,
		"孙悟空": 100000,
	}
	for k, v := range insertInfo {
		ret, err := DB.Exec(sqlStr, k, v)
		if err != nil {
			fmt.Printf("insert failed, err:%v\n", err)
			return
		}
		theID, err := ret.LastInsertId() // 新插入数据的id
		if err != nil {
			fmt.Printf("get lastinsert ID failed, err:%v\n", err)
			return
		}
		fmt.Printf("insert success, the id is %d.\n", theID)
	}
}

// 查询数据
func Get(id int) {
	var u user
	sqlStr := "select id,name,age from user where id=?"
	row := DB.QueryRow(sqlStr, id)
	err := row.Scan(&u.id, &u.name, &u.age)
	if err != nil {
		fmt.Println("数据读取失败. err:", err)
		return
	}
	// 输出数据
	fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
}

// 查询多行数据
func GetAll(id int) {
	sqlStr := "select id,name,age from user where id>?"
	rows, err := DB.Query(sqlStr, id)
	if err != nil {
		fmt.Println("数据查询失败. err:", err)
	}
	defer rows.Close()
	// 循环读数据
	for rows.Next() {
		var u user
		err := rows.Scan(&u.id, &u.name, &u.age)
		if err != nil {
			fmt.Println("数据读取失败. err:", err)
			return
		}
		// 输出数据
		fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
	}
}

// 更新数据
func Update(age, id int) {
	sqlStr := "update user set age=? where id = ?"
	ret, err := DB.Exec(sqlStr, age, id)
	if err != nil {
		fmt.Println("数据更新失败. err:", err)
		return
	}
	// 操作影响的行数
	rowNum, err := ret.RowsAffected()
	if err != nil {
		fmt.Println("获取影响的行数失败. err:", err)
		return
	}
	// 打印影响的行数
	fmt.Printf("修改成功，影响行数:%d\n", rowNum)
}

// 删除数据
func Delete(id int) {
	sqlStr := "delete from user where id = ?"
	ret, err := DB.Exec(sqlStr, id)
	if err != nil {
		fmt.Printf("数据删除失败, err:%v\n", err)
		return
	}
	n, err := ret.RowsAffected() // 操作影响的行数
	if err != nil {
		fmt.Printf("获取受影响行数失败, err:%v\n", err)
		return
	}
	fmt.Printf("删除成功，影响行数:%d\n", n)
}
